﻿//1.  用自调用匿名函数包裹代码,可以避免跟其他人的代码变量冲突
//2.  将系统变量以变量形式传递到插件内部,window等系统变量在插件内部就有了一个局部的引用，可以提高访问速度，会有些许性能的提升
//2.1 为了得到没有被修改的undefined，我们并没有传递这个参数，但却在接收时接收了它，因为实际并没有传，所以‘undefined’那个位置接收到的就是真实的'undefined'
//3.  在代码开头加一个分号，这在任何时候都是一个好的习惯
; var pageHelper = (function ($, window, document, undefined) {
    //默认参数
    var defaults = {
        /*****   分页用参数   *****/
        pageIndex: 1,   //第几页
        pageSize: 10,   //每页显示数量
        pageDiv: "",    //显示分页控件的容器ID
        /*****   ajax参数   *****/
        url: "",
        data:
        {
            pageIndex: 1,
            pageSize: 10,
            rId: Math.random()
        },
        async: true,
        dataType: "json",
        completed: function () { },
        /*****   Knockout参数   *****/
        viewModelId: ""
    };
    //其他全局参数
    var pageCount = 1;
    var opt = {};

    var setOptions = function (data) {
        opt = $.extend(opt, data || {});
    };

    var Init = function (options) {
        //将默认参数与自定义参数合并
        opt = {};
        opt = $.extend({}, defaults, options || {});
        //调用goPage方法
        this.goPage(opt.pageIndex);
    };

    var goPage = function (pageIndex) {
        //不存在时，设为1
        if (!pageIndex)
            pageIndex = 1;

        //设置参数
        opt.pageIndex = pageIndex;
        opt.data.pageIndex = opt.pageIndex;
        opt.data.pageSize = opt.pageSize;
        //ajax访问后台
        $.ajax({
            url: opt.url,
            async: opt.async,
            dataType: opt.dataType,
            data: opt.data,
            //成功，绑定数据
            success: function (data) {
                if (data != null && data != "") {
                    //Knockout绑定
                    viewModel = {};
                    viewModel[opt.viewModelId] = ko.observableArray(data.Data);
                    ko.applyBindings(viewModel);

                    //分页拼接
                    var page = $(opt.pageDiv);
                    page.html("");
                    var count = 1;
                    if (data.pageIndex == 1) {
                        pageCount = data.pageCount;
                        $('<a href="javascript:void(0);" class="prev">◀</a>').appendTo(page);
                        $('<a href="javascript:void(0);" class="active">1</a>').appendTo(page);
                    } else {
                        //上一页
                        $('<a href="javascript:void(0);" class="prev">◀</a>').unbind("click").bind("click",
                        function () {
                            pageHelper.goPage(data.pageIndex - 1);
                            return;
                        }).appendTo(page);
                        //第一页
                        $('<a href="javascript:void(0);">1</a>').unbind("click").bind("click",
                        function () {
                            pageHelper.goPage(1);
                            return;
                        }).appendTo(page);
                    }
                    //省略号后，过2个页数框
                    if (count < data.pageIndex - 3) {
                        $(page).append('...');
                        count = data.pageIndex - 3;
                    }
                    if (pageCount > 6 && count > pageCount - 6) {
                        count = pageCount - 6;
                    }
                    for (var i = 0; i < 5; i++) {
                        count++;
                        if (count < pageCount) {
                            if (data.pageIndex == count) {
                                $('<a href="javascript:void(0);" class="active">' + count + '</a>').appendTo(page);
                            } else {
                                $('<a href="javascript:void(0);">' + count + '</a>').bind('click', { pageIndex: count }, function (event) {
                                    pageHelper.goPage(event.data.pageIndex);
                                    return;
                                }).appendTo(page);
                            }
                        }
                    }
                    if (count + 1 < pageCount) {
                        $(page).append('...');
                    }
                    if (pageCount > count) {
                        if (data.pageIndex == pageCount) {
                            $('<a href="javascript:void(0);" class="active">' + pageCount + '</a>').appendTo(page);
                        } else {
                            $('<a href="javascript:;">' + pageCount + '</a>').bind('click', function () {
                                pageHelper.goPage(pageCount);
                                return;
                            }).appendTo(page);
                        }
                    }
                    if (data.pageIndex == pageCount) {
                        //下一页
                        $('<a href="javascript:void(0);" class="next">▶</a>').appendTo(page);
                    } else {
                        //下一页
                        $('<a href="javascript:void(0);" class="next">▶</a>').bind('click', function () {
                            pageHelper.goPage(data.pageIndex + 1);
                            return;
                        }).appendTo(page);
                    }
                    //跳转
                    //$('到').appendTo(page);
                    //$('<input type="text" name="txt_goPageIndex" id="txt_goPageIndex" class="input">').appendTo(page);
                    //$('页').appendTo(page);
                }
            },
            //失败，提示
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                alert("textStatus:" + textStatus + ",errorThrown:" + errorThrown);
            },
            //完成，调用自定义方法
            complete: opt.completed
        });
    };

    return {
        setOptions: setOptions,
        Init: Init,
        goPage: goPage
    };

    ////定义jQuery扩展
    //$.extend($.pageHelper.prototype, {
    //    setOptions: function (data) {
    //        this.opt = $.extend(this.opt, data || {});
    //    },
    //    goPage: function (pageIndex) {
    //        //不存在时，设为1
    //        if (!pageIndex)
    //            pageIndex = 1;
    //        //设置参数
    //        this.opt.pageIndex = pageIndex;
    //        this.opt.data.pageIndex = this.opt.pageIndex;
    //        this.opt.data.pageSize = this.opt.pageSize;
    //        //ajax访问后台
    //        $.ajax({
    //            url: this.opt.url,
    //            async: this.opt.async,
    //            dataType: this.opt.dataType,
    //            data: this.opt.data,
    //            //成功，绑定数据
    //            success: function (data) {
    //                //Knockout绑定
    //                viewModel = {};
    //                viewModel[this.opt.viewModelId] = ko.observableArray(data);
    //                ko.applyBindings(viewModel);
    //                //分页控件拼接
    //                console.log(this);
    //            },
    //            //失败，提示
    //            error: function (XMLHttpRequest, textStatus, errorThrown) {
    //                alert("textStatus:" + textStatus + ",errorThrown:" + errorThrown);
    //            },
    //            //完成，调用自定义方法
    //            complete: opt.completed
    //        });
    //    }
    //});
    //$.extend({
    //    pageHelper: function (options) {
    //        //将默认参数与自定义参数合并
    //        this.opt = $.extend({}, this.defaults, options || {});
    //        //设置ajax参数
    //        this.opt.data.pageIndex = this.opt.pageIndex;
    //        this.opt.data.pageSize = this.opt.pageSize;
    //        //ajax访问后台
    //        $.ajax({
    //            url: this.opt.url,
    //            async: this.opt.async,
    //            dataType: this.opt.dataType,
    //            data: this.opt.data,
    //            //成功，绑定数据
    //            success: function (data) {
    //                //Knockout绑定
    //                viewModel = {};
    //                viewModel[this.opt.viewModelId] = ko.observableArray(data);
    //                ko.applyBindings(viewModel);
    //                //分页控件拼接
    //                console.log(this);
    //            },
    //            //失败，提示
    //            error: function (XMLHttpRequest, textStatus, errorThrown) {
    //                alert("textStatus:" + textStatus + ",errorThrown:" + errorThrown);
    //            },
    //            //完成，调用自定义方法
    //            complete: opt.completed
    //        });
    //    }
    //});
})(jQuery, window, document);